package com.durian.utils;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

/**
 * Result统一返回类型
 *
 * @author Durian
 * @date 2023/11/27
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {

    /**
     * 成功信息
     */
    private static final Integer SUCCESS = 200;

    /**
     * 失败信息
     */
    private static final Integer ERROR = 500;

    /**
     * 状态
     */
    private Integer code;

    /**
     * 返回的信息
     */
    private String msg;

    /**
     * 数据
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Object data;

    /**
     * 包含状态和返回信息的构造器
     *
     * @param code 状态码
     * @param msg  返回信息
     */
    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }


    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static Result success() {
        return Result.success("success");
    }

    /**
     * 返回成功消息
     *
     * @param data 数据
     */
    public static Result success(Object data) {
        return Result.success("success", data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回消息
     * @return 成功消息
     */
    public static Result success(String msg) {
        return Result.success(HttpStatus.OK.value(), msg);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回消息
     * @return 成功消息
     */
    public static Result success(Integer code, String msg) {
        return new Result(code, msg);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回消息
     * @param data 数据
     * @return 成功消息
     */
    public static Result success(String msg, Object data) {
        return new Result(HttpStatus.OK.value(), msg, data);
    }

    /**
     * 返回失败消息
     *
     * @return 失败消息
     */
    public static Result error() {
        return Result.error("操作失败");
    }

    /**
     * 返回失败消息
     *
     * @param msg 返回消息
     * @return 失败消息
     */
    public static Result error(String msg) {
        return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg);
    }

    /**
     * 返回失败消息
     *
     * @param code 状态
     * @param msg  返回消息
     * @return 失败消息
     */
    public static Result error(Integer code, String msg) {
        return new Result(code, msg);
    }

}
